package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.TimeZone;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ValueBoxBase.TextAlignment;
import com.google.gwt.user.datepicker.client.DateBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.client.VentasService.VentasService;
import edu.client.VentasService.VentasServiceAsync;
import edu.shared.DTO.ClaseEquipoPatronDTO;
import edu.shared.DTO.ComponentePatronDTO;
import edu.shared.DTO.EquipoPatronDTO;
import edu.shared.DTO.OrdenPedidoDTO;
import edu.shared.DTO.RenglonOrdenPedidoDTO;
import edu.shared.DTO.SubclaseEquipoPatronDTO;

public class P_EditarOrdenPedido extends Composite {
	
	private TabPanel padre;
	private String tituloTab;
	
	private static final int CODIGO = 0;
	private static final int NOMBRE_PARA_CLIENTE = 1;
	private static final int CANTIDAD = 2;
	private static final int OBSERVACIONES = 3;
	private static final int ELIMINAR = 4;

	private IngenieriaServiceAsync ingenieriaService;
	private VentasServiceAsync ventasService;
	
	TextBox nroOrdenPedidoTB;
	TextBox clienteTB;
	TextBox fechaGeneracionTB;
	DateBox fechaPrevistaEntregaDB;
	TextArea observacionTA;
	
	ListBox tipoCombo;
	ListBox claseEquipoCombo;
	ListBox subclaseEquipoCombo;
	TextArea descripcionTecnicaTA;
	ListBox planoCombo;
	Label componenteLabel;
	ListBox componenteCombo;
	
	FlexTable equiposYComponentesFT;
	
	TextBox nombreParaClienteTB;
	TextBox cantidadTB;
	TextArea observacionesEquipoOComponenteTA;
	Button agregarRenglonBtn;
	Button agregarDesdeAlmacenBtn;
	
	Button guardarBtn;
	Button generarBtn;
	
	List<EquipoPatronDTO> equiposPatronDTO;
	List<ComponentePatronDTO> componentesPatronDTO;
	
	OrdenPedidoDTO ordenPedidoDTO;
	LinkedList<RenglonOrdenPedidoDTO> renglonesDesdeAlmacen = new LinkedList<RenglonOrdenPedidoDTO>();
	LinkedList<RenglonOrdenPedidoDTO> renglonesOrdenPedidoDTO = new LinkedList<RenglonOrdenPedidoDTO>();
	String nombreResponsable = "";
	
	public P_EditarOrdenPedido(TabPanel padre, String titulo, long nroOrdenPedido) {
		
		this.tituloTab = titulo;
		this.padre = padre;
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "970px");

		ventasService = GWT.create(VentasService.class);
		
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		//Sección donde se establece el detalle de la orden de pedido.		
		ventasService.getOrdenPedidoCompleta(nroOrdenPedido, new AsyncCallback<OrdenPedidoDTO>() {
			public void onSuccess(OrdenPedidoDTO result) {	
				ordenPedidoDTO = result;
				nombreResponsable = ordenPedidoDTO.getNombreEmpleado();
				cargarPantalla();
			}

			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});
		
		Label detalleOrdenPedidoLabel = new Label("DETALLE DE LA ORDEN DE PEDIDO");
		detalleOrdenPedidoLabel.setStyleName("labelTitulo");
		layoutPanel.add(detalleOrdenPedidoLabel);
		layoutPanel.setWidgetLeftWidth(detalleOrdenPedidoLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(detalleOrdenPedidoLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label nroOrdenPedidoLabel = new Label("Nº ORDEN DE PEDIDO:");
		nroOrdenPedidoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nroOrdenPedidoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nroOrdenPedidoLabel);
		layoutPanel.setWidgetLeftWidth(nroOrdenPedidoLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenPedidoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		nroOrdenPedidoTB = new TextBox();
		layoutPanel.add(nroOrdenPedidoTB);
		layoutPanel.setWidgetLeftWidth(nroOrdenPedidoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nroOrdenPedidoTB, 65.0, Unit.PX, 32.0, Unit.PX);
		nroOrdenPedidoTB.setEnabled(false);
		
		Label clienteLabel = new Label("CLIENTE:");
		clienteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		clienteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(clienteLabel);
		layoutPanel.setWidgetLeftWidth(clienteLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(clienteLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		clienteTB = new TextBox();
		layoutPanel.add(clienteTB);
		layoutPanel.setWidgetLeftWidth(clienteTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(clienteTB, 100.0, Unit.PX, 32.0, Unit.PX);
		clienteTB.setEnabled(false);
		
		Label observacionLabel = new Label("OBSERVACIÓN:");
		observacionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		observacionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(observacionLabel);
		layoutPanel.setWidgetLeftWidth(observacionLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(observacionLabel, 148.0, Unit.PX, 19.0, Unit.PX);
		
		observacionTA = new TextArea();
		layoutPanel.add(observacionTA);
		layoutPanel.setWidgetLeftWidth(observacionTA, 17.5, Unit.PCT, /*67.5*/77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(observacionTA, 135.0, Unit.PX, 47.0, Unit.PX);
		
		Label fechaGeneracionLabel = new Label("FECHA DE GENERACION:");
		fechaGeneracionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		fechaGeneracionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(fechaGeneracionLabel);
		layoutPanel.setWidgetLeftWidth(fechaGeneracionLabel, /*47.0*/52.0, Unit.PCT, 17.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaGeneracionLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		fechaGeneracionTB = new TextBox();
		layoutPanel.add(fechaGeneracionTB);
		layoutPanel.setWidgetLeftWidth(fechaGeneracionTB, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaGeneracionTB, 65.0, Unit.PX, 32.0, Unit.PX);
		fechaGeneracionTB.setEnabled(false);
		
		Label fechaPrevistaEntregaLabel = new Label("FECHA PREVISTA DE ENTREGA:");
		fechaPrevistaEntregaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		fechaPrevistaEntregaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(fechaPrevistaEntregaLabel);
		layoutPanel.setWidgetLeftWidth(fechaPrevistaEntregaLabel, /*47.0*/52.0, Unit.PCT, 17.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaPrevistaEntregaLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
		fechaPrevistaEntregaDB = new DateBox();
		fechaPrevistaEntregaDB.setFormat(new DateBox.DefaultFormat(formatoFecha));
		layoutPanel.add(fechaPrevistaEntregaDB);
		layoutPanel.setWidgetLeftWidth(fechaPrevistaEntregaDB, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(fechaPrevistaEntregaDB, 100.0, Unit.PX, 32.0, Unit.PX);
		fechaPrevistaEntregaDB.setFormat(new DateBox.DefaultFormat(formatoFecha));
		
		//Sección donde se incluyen los equipos y componentes a la orden de pedido.
		Label equiposYComponentesLabel = new Label("EQUIPOS Y COMPONENTES A INCLUIR");
		equiposYComponentesLabel.setStyleName("labelTitulo");
		layoutPanel.add(equiposYComponentesLabel);
		layoutPanel.setWidgetLeftWidth(equiposYComponentesLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposYComponentesLabel, 182.0, Unit.PX, 50.0, Unit.PX);
		
		Label tipoLabel = new Label("TIPO:");
		tipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		tipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(tipoLabel);
		layoutPanel.setWidgetLeftWidth(tipoLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tipoLabel, 240.0, Unit.PX, 19.0, Unit.PX);
		
		tipoCombo = new ListBox();
		layoutPanel.add(tipoCombo);
		layoutPanel.setWidgetLeftWidth(tipoCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tipoCombo, 235.0, Unit.PX, 32.0, Unit.PX);
		
		tipoCombo.addItem("EQUIPO");
		tipoCombo.addItem("COMPONENTE");
		
		//Si se cambia el tipo seleccionado, se modifican los campos mostrados.
		tipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
					componenteLabel.setVisible(false);
					componenteCombo.setVisible(false);
					
					cargarComboClaseEquipo();
					
					//Que no se permita agregar un equipo que tenga alguno de estos campos vacíos.
					if((claseEquipoCombo.getItemCount() == 0)||(subclaseEquipoCombo.getItemCount() == 0)||(equiposPatronDTO.isEmpty()))
						agregarRenglonBtn.setEnabled(false);
					else
						agregarRenglonBtn.setEnabled(true);
				}
				else {
					componenteLabel.setVisible(true);
					componenteCombo.setVisible(true);
					componenteCombo.clear();
					
					cargarComboClaseEquipoComponente();
					
					//Que no se permita agregar un componente que tenga alguno de estos campos vacíos.
					if((claseEquipoCombo.getItemCount() == 0)||(subclaseEquipoCombo.getItemCount() == 0)||(componenteCombo.getItemCount() == 0)||(componentesPatronDTO.isEmpty()))
						agregarRenglonBtn.setEnabled(false);
					else
						agregarRenglonBtn.setEnabled(true);
				}
			}
		});
		
		AbsolutePanel equipoOComponenteAP = new AbsolutePanel();
		equipoOComponenteAP.setStyleName("panelConBorde");
		layoutPanel.add(equipoOComponenteAP);
		layoutPanel.setWidgetLeftWidth(equipoOComponenteAP, 4.0, Unit.PCT, /*82.0*/92.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equipoOComponenteAP, 275.0, Unit.PX, /*140.0*/193.0, Unit.PX);
		
		Label claseEquipoLabel = new Label("CLASE DE EQUIPO:");
		claseEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseEquipoLabel);
		layoutPanel.setWidgetLeftWidth(claseEquipoLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoLabel, 293.0, Unit.PX, 19.0, Unit.PX);
		
		claseEquipoCombo = new ListBox();
		layoutPanel.add(claseEquipoCombo);
		layoutPanel.setWidgetLeftWidth(claseEquipoCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoCombo, 288.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la clase de equipo seleccionada, listamos las subclases correspondientes.
		claseEquipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO"))
					cargarComboSubclaseEquipo();
				else
					cargarComboSubclaseEquipoComponente();
			}
		});
		
		Label subclaseEquipoLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseEquipoLabel);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoLabel, /*49.0*/54.0, Unit.PCT, 15.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoLabel, 293.0, Unit.PX, 19.0, Unit.PX);
		
		subclaseEquipoCombo = new ListBox();
		layoutPanel.add(subclaseEquipoCombo);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoCombo, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoCombo, 288.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la subclase de equipo seleccionada, listamos los planos correspondientes.
		subclaseEquipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO"))
					cargarComboPlanoEquipo();
				else
					cargarComboComponente();   
			}
		});
		
		Label descripcionTecnicaEquipoLabel = new Label("DESCRIPCIÓN TÉCNICA:");
		descripcionTecnicaEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		descripcionTecnicaEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(descripcionTecnicaEquipoLabel);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaEquipoLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaEquipoLabel, /*371.0*/398.0, Unit.PX, 19.0, Unit.PX);
		
		descripcionTecnicaTA = new TextArea();
		layoutPanel.add(descripcionTecnicaTA);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaTA, 17.5, Unit.PCT, /*67.5*/77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaTA, 358.0, Unit.PX, /*47.0*/100.0, Unit.PX);
		descripcionTecnicaTA.setEnabled(false);
		
		componenteLabel = new Label("COMPONENTE:");
		componenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		componenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(componenteLabel);
		layoutPanel.setWidgetLeftWidth(componenteLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteLabel, 328.0, Unit.PX, 19.0, Unit.PX);
		
		componenteCombo = new ListBox();
		layoutPanel.add(componenteCombo);
		layoutPanel.setWidgetLeftWidth(componenteCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteCombo, 323.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el componente seleccionado, listamos los planos correspondientes.
		componenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboPlanoComponente();              
			}
		});
		
		Label planoEquipoLabel = new Label("PLANO:");
		planoEquipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		planoEquipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(planoEquipoLabel);
		layoutPanel.setWidgetLeftWidth(planoEquipoLabel, /*49.0*/54.0, Unit.PCT, 15.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoEquipoLabel, 328.0, Unit.PX, 19.0, Unit.PX);
		
		planoCombo = new ListBox();
		layoutPanel.add(planoCombo);
		layoutPanel.setWidgetLeftWidth(planoCombo, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoCombo, 323.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el plano de equipo seleccionado, mostramos su descripción técnica correspondiente.
		planoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				descripcionTecnicaTA.setText(componentesPatronDTO.get(planoCombo.getSelectedIndex()).getDescripcionTecnica());
			}
		});
		
		Label nombreParaClienteLabel = new Label("NOMBRE PARA CLIENTE:");
		nombreParaClienteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nombreParaClienteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nombreParaClienteLabel);
		layoutPanel.setWidgetLeftWidth(nombreParaClienteLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreParaClienteLabel, /*435.0*/488.0, Unit.PX, 19.0, Unit.PX);
		
		nombreParaClienteTB = new TextBox();
		layoutPanel.add(nombreParaClienteTB);
		layoutPanel.setWidgetLeftWidth(nombreParaClienteTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreParaClienteTB, /*430.0*/483.0, Unit.PX, 32.0, Unit.PX);
		nombreParaClienteTB.setMaxLength(249);
		
		Label cantidadLabel = new Label("CANTIDAD:");
		cantidadLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(cantidadLabel);
		layoutPanel.setWidgetLeftWidth(cantidadLabel, /*38.0*/43.0, Unit.PCT, 75.0, Unit.PX);
		layoutPanel.setWidgetTopHeight(cantidadLabel, /*435.0*/488.0, Unit.PX, 19.0, Unit.PX);
		
		cantidadTB = new TextBox();
		layoutPanel.add(cantidadTB);
		layoutPanel.setWidgetLeftWidth(cantidadTB, /*44.0*/49.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cantidadTB, /*430.0*/483.0, Unit.PX, 32.0, Unit.PX);
		cantidadTB.setMaxLength(3);
		cantidadTB.setAlignment(TextAlignment.CENTER);
		
		Label observacionesEquipoOComponenteLabel = new Label("OBSERVACIONES:");
		observacionesEquipoOComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		observacionesEquipoOComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(observacionesEquipoOComponenteLabel);
		layoutPanel.setWidgetLeftWidth(observacionesEquipoOComponenteLabel, /*49.0*/54.0, Unit.PCT, 15.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(observacionesEquipoOComponenteLabel, /*435.0*/488.0, Unit.PX, 19.0, Unit.PX);
		
		observacionesEquipoOComponenteTA = new TextArea();
		layoutPanel.add(observacionesEquipoOComponenteTA);
		layoutPanel.setWidgetLeftWidth(observacionesEquipoOComponenteTA, /*65.0*/70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(observacionesEquipoOComponenteTA, /*422.0*/475.0, Unit.PX, 47.0, Unit.PX);
		
		componenteLabel.setVisible(false);
		componenteCombo.setVisible(false);
		
		agregarDesdeAlmacenBtn = new Button("AGREGAR DESDE ALMACÉN");
		layoutPanel.add(agregarDesdeAlmacenBtn);
		layoutPanel.setWidgetLeftWidth(agregarDesdeAlmacenBtn, 30.0, Unit.PCT, 17.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(agregarDesdeAlmacenBtn, /*480.0*/535.0, Unit.PX, 28.0, Unit.PX);
		
		agregarDesdeAlmacenBtn.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				agregarDesdeAlmacen();
			}
		});
				
		agregarRenglonBtn = new Button("AGREGAR RENGLÓN");
		layoutPanel.add(agregarRenglonBtn);
		layoutPanel.setWidgetLeftWidth(agregarRenglonBtn, 53.0, Unit.PCT, 17.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(agregarRenglonBtn, /*480.0*/535.0, Unit.PX, 28.0, Unit.PX);
		
		//Si se agrega un renglón nuevo, se verifica si es un equipo o componente lo que se desea cargar.
		agregarRenglonBtn.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
									
				if (validarCampos()) {			
					if (tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
						EquipoPatronDTO equipoPatronDTO = equiposPatronDTO.get(planoCombo.getSelectedIndex());
						cargarEquipo(equipoPatronDTO);
					}
					
					else if (tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE")) {
						ComponentePatronDTO componentePatronDTO = componentesPatronDTO.get(planoCombo.getSelectedIndex());
						cargarComponente(componentePatronDTO);
						}			
				}
			}
		});
		
		
		//Sección de la tabla.
		ScrollPanel contenedorTablaSP = new ScrollPanel();
		contenedorTablaSP.setStyleName("tabla");
		layoutPanel.add(contenedorTablaSP);
		layoutPanel.setWidgetLeftWidth(contenedorTablaSP, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(contenedorTablaSP, /*519.0*/580.0, Unit.PX, 250.0, Unit.PX);
		
		equiposYComponentesFT = new FlexTable();
		contenedorTablaSP.setWidget(equiposYComponentesFT);
		equiposYComponentesFT.setSize("100%", "100%");

		equiposYComponentesFT.setText(0, CODIGO, "CÓDIGO");
		equiposYComponentesFT.getCellFormatter().setWidth(0, CODIGO, "15%");
		equiposYComponentesFT.setText(0, NOMBRE_PARA_CLIENTE, "NOMBRE PARA CLIENTE");
		equiposYComponentesFT.getCellFormatter().setWidth(0, NOMBRE_PARA_CLIENTE, "25%");
		equiposYComponentesFT.setText(0, CANTIDAD, "CANTIDAD");
		equiposYComponentesFT.getCellFormatter().setWidth(0, CANTIDAD, "8%");
		equiposYComponentesFT.setText(0, OBSERVACIONES, "OBSERVACIONES");
		equiposYComponentesFT.getCellFormatter().setWidth(0, OBSERVACIONES, "44%");
		equiposYComponentesFT.setText(0, ELIMINAR, "ELIMINAR");
		equiposYComponentesFT.getCellFormatter().setWidth(0, ELIMINAR, "8%");
		equiposYComponentesFT.getRowFormatter().addStyleName(0, "tablaEncabezado");	
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, /*775.0*/835.0, Unit.PX, 50.0, Unit.PX);
		
		//Sección de los últimos botones.
		Button salirBtn = new Button("CANCELAR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(salirBtn, /*842.0*/902.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar(event);
			}
		});
		
		generarBtn = new Button("GENERAR");
		layoutPanel.add(generarBtn);
		layoutPanel.setWidgetRightWidth(generarBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(generarBtn, /*842.0*/902.0, Unit.PX, 28.0, Unit.PX);
		
		generarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				generarBtn.setEnabled(false);
				
				if (validarOrden()) {
					ordenPedidoDTO.setRenglonOrdenPedidosDTO(renglonesOrdenPedidoDTO);
					generarOrdenPedido();
				}
			}
		});
		
		guardarBtn = new Button("GUARDAR");
		layoutPanel.add(guardarBtn);
		layoutPanel.setWidgetRightWidth(guardarBtn, 30.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(guardarBtn, /*842.0*/902.0, Unit.PX, 28.0, Unit.PX);	
		
		guardarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				guardarBtn.setEnabled(false);
				
				if (validarOrden()) {
					ordenPedidoDTO.setRenglonOrdenPedidosDTO(renglonesOrdenPedidoDTO);
					guardarOrdenPedido();
				}
			}
		});
		
		//Creación de las listas a utilizar.
		equiposPatronDTO = new LinkedList<EquipoPatronDTO>();
		componentesPatronDTO = new LinkedList<ComponentePatronDTO>();
		
		//Cargamos claseEquipoCombo con todas las clases de equipos patron que existen.
		cargarComboClaseEquipo();
	}
	
	
	/**
	 * Método que permite cargar la pantalla con la orden de pedido que se buscó.
	 */
	private void cargarPantalla() {
		nroOrdenPedidoTB.setText(String.valueOf(ordenPedidoDTO.getNroOrden()));
		clienteTB.setText(ordenPedidoDTO.getNombreCliente());
		
		if (clienteTB.getText().equals("ORDEN PLANIFICADA")) {
			agregarDesdeAlmacenBtn.setEnabled(false);
			nombreParaClienteTB.setEnabled(false);
			observacionesEquipoOComponenteTA.setEnabled(false);
		}
		else {
			agregarDesdeAlmacenBtn.setEnabled(true);
			nombreParaClienteTB.setEnabled(true);
			observacionesEquipoOComponenteTA.setEnabled(true);
		}
		
		observacionTA.setText(ordenPedidoDTO.getObservacion());
		
		if (ordenPedidoDTO.getEstado().equals("GENERADA"))
			guardarBtn.setEnabled(false);
		
		DateTimeFormat formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
		String fechaOrden = formatoFecha.format(ordenPedidoDTO.getFechaGeneracion(), TimeZone.createTimeZone(0));
		
		fechaGeneracionTB.setText(fechaOrden);
		fechaPrevistaEntregaDB.setValue(ordenPedidoDTO.getFechaPrevistaEntrega());
		
		for (final RenglonOrdenPedidoDTO renglon : ordenPedidoDTO.getRenglonOrdenPedidosDTO()) {
			int filaSiguiente = equiposYComponentesFT.getRowCount();
	
			equiposYComponentesFT.setText(filaSiguiente, CODIGO, renglon.getCodigo());
			
			//Si el campo Nombre para cliente es demasiado grande, se le colocan tres puntos y se lo acorta.
			if (renglon.getNombre().length() > 30)
				equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre().substring(0, 30) + "...");
			else
				equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre());
			
			equiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(renglon.getCantidad()));
			
			//Si el campo Observaciones es demasiado grande, se le colocan tres puntos y se lo acorta.
			if (renglon.getObservaciones().length() > 50)
				equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, renglon.getObservaciones().substring(0, 50) + "...");
			else
				equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, renglon.getObservaciones());
			
			//Creamos el Label para eliminar y le seteamos su clickHandler.
			Label eliminarLb = new Label("");
			eliminarLb.setSize("16px", "16px");
			eliminarLb.setStyleName("labelBorrar");
			
			eliminarLb.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					int aEliminar = equiposYComponentesFT.getCellForEvent(event).getRowIndex();
					equiposYComponentesFT.removeRow(aEliminar);
					
					RenglonOrdenPedidoDTO renglonAEliminar = renglonesOrdenPedidoDTO.get(aEliminar - 1);
					actualizarCantidadesInventario(renglonAEliminar, -renglonAEliminar.getCantidad());
					
					renglonesOrdenPedidoDTO.remove(aEliminar - 1);
				}
			});
			
			equiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
			equiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
			equiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
			
			//Agregamos el renglón a la lista de renglones existente.
			renglonesOrdenPedidoDTO.add(renglon);
		}
	}
	
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo con todas las clases existentes.
	 */
	private void cargarComboClaseEquipo() {
		
		claseEquipoCombo.clear();
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipo();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipo() {
		
		subclaseEquipoCombo.clear();
		
		//Si no existe ninguna clase de equipo cargada, que no busque subclases.
		if(claseEquipoCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los planos pertenecientes a una clase y subclase de equipo particular.
					cargarComboPlanoEquipo();
				}
			});
		}
		else {
			//Window.alert("No existen clases cargadas.");
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los planos existentes con la última versión para un equipo particular.
	 */
	private void cargarComboPlanoEquipo() {
		
		equiposPatronDTO.clear();
		planoCombo.clear();
		
		if (subclaseEquipoCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
		
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
					
			ingenieriaService.buscarPlanosEquipoPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<EquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<EquipoPatronDTO> result) {
					equiposPatronDTO = result;
					
					//Cargamos el comboBox con los planos de equipo patron existentes, mostrando código.
					for(EquipoPatronDTO equipoPatronDTO : equiposPatronDTO)
						planoCombo.addItem(Validaciones.rellenarCodigo(equipoPatronDTO.getPlano()));
	
					//Si no existen equipos patrones para esta clase, que envíe un mensaje.
					if (!equiposPatronDTO.isEmpty())
						descripcionTecnicaTA.setText(equiposPatronDTO.get(0).getDescripcionTecnica());
					else {
						//Window.alert("No existen planos de equipo patrón para esta clase y subclase.");
						descripcionTecnicaTA.setText("");
						agregarRenglonBtn.setEnabled(false);
					}
				}
			});
		}
		else {
			//Window.alert("No existen subclases cargadas para esta clase.");
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboClaseEquipoComponente() {
		
		claseEquipoCombo.clear();
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipoComponente();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipoComponente() {
		
		subclaseEquipoCombo.clear();
		
		//Si no existe ninguna clase de equipo cargada, que no busque subclases.
		if(claseEquipoCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes para un componente, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los componentes pertenecientes a una clase y subclase de equipo particular.
					cargarComboComponente();
				}
			});
		}
		else {
			//Window.alert("No existen clases cargadas.");
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los componentes existentes.
	 */
	private void cargarComboComponente() {
		
		componenteCombo.clear();
		
		//Si no existe ninguna subclase de equipo cargada, que no busque componentes.
		if(claseEquipoCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);

			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarComponentesPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
				
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {
					componentesPatronDTO = result;
										
					//Cargamos el comboBox con los componentes patron existentes, mostrando código y nombre .
					for(ComponentePatronDTO componentePatronDTO : componentesPatronDTO) {
						componenteCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getCodigoComponente()) + Validaciones.rellenarCodigo(componentePatronDTO.getCodigoSubcomponente()) + " - " + componentePatronDTO.getNombre());
					}
	
					//Cargamos el comboBox con los planos pertenecientes a un componente particular.
					cargarComboPlanoComponente();
				}
			});
		}
		else {
			//Window.alert("No existen subclases cargadas.");
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los planos existentes con la última versión para un componente particular.
	 */
	private void cargarComboPlanoComponente() {
		
		componentesPatronDTO.clear();
		planoCombo.clear();
		
		if (componenteCombo.getItemCount() > 0) {
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoComponente = Integer.parseInt((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(0, 2)));
			int codigoSubcomponente = Integer.parseInt((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(2, 4)));
			
			agregarRenglonBtn.setEnabled(true);
					
			ingenieriaService.buscarPlanosComponentePatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, codigoComponente, codigoSubcomponente, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {
					componentesPatronDTO = result;
					
					//Cargamos el comboBox con los planos de equipo patron existentes, mostrando código.
					for(ComponentePatronDTO componentePatronDTO : componentesPatronDTO)
						planoCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getPlano()));
	
					//Si no existen equipos patrones para esta clase, que envíe un mensaje.
					if (!componentesPatronDTO.isEmpty())
						descripcionTecnicaTA.setText(componentesPatronDTO.get(0).getDescripcionTecnica());
					else {
						//Window.alert("No existen planos de componente patrón para esta clase y subclase.");
						descripcionTecnicaTA.setText("");
						agregarRenglonBtn.setEnabled(false);
					}
				}
			});
		}
		else {
			//Window.alert("No existen componentes cargados.");
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	
	/**
	 * Método que carga un equipo que va a ser construido a la tabla de equipos y componentes.
	 */
	public void cargarEquipo(EquipoPatronDTO equipoPatronDTO) {
		
		RenglonOrdenPedidoDTO renglon = new RenglonOrdenPedidoDTO();
		
		//Se establece el nombre de clase y subclase.
		equipoPatronDTO.setNombreClase((claseEquipoCombo.getItemText(claseEquipoCombo.getSelectedIndex()).split(" - "))[1]);
		equipoPatronDTO.setNombreSubclase((subclaseEquipoCombo.getItemText(subclaseEquipoCombo.getSelectedIndex()).split(" - "))[1]);
		
		//Se establece el tipo que hay en el renglón y su id.
		renglon.setEquipoOComponente("EQUIPO");
		renglon.setIdEquipoOComponente(equipoPatronDTO.getIdEquipoPatron());
		
		int filaSiguiente = equiposYComponentesFT.getRowCount();
		
		//Se rellena el código de equipo para que tenga la longitud y formato adecuados.
		equiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoEquipoPatron(equipoPatronDTO));
		renglon.setCodigo(Validaciones.rellenarCodigoEquipoPatron(equipoPatronDTO));
		
		//Si el Nombre para cliente está vacío, se establece el mismo como la concatenación de su nombre de clase más el de subclase.
		if (nombreParaClienteTB.getText().isEmpty())
			renglon.setNombre(equipoPatronDTO.getNombreClase() + " - " + equipoPatronDTO.getNombreSubclase());
		else
			renglon.setNombre(nombreParaClienteTB.getText());
		
		//Si el campo Nombre para cliente es demasiado grande, se le colocan tres puntos y se lo acorta.
		if (renglon.getNombre().length() > 30)
			equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre().substring(0, 30) + "...");
		else
			equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre());
		
		equiposYComponentesFT.setText(filaSiguiente, CANTIDAD, cantidadTB.getText());
		renglon.setCantidad(Integer.parseInt(cantidadTB.getText()));
		
		//Si el campo Observaciones es demasiado grande, se le colocan tres puntos y se lo acorta.
		if (observacionesEquipoOComponenteTA.getText().length() > 50)
			equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, observacionesEquipoOComponenteTA.getText().substring(0, 50) + "...");
		else
			equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, observacionesEquipoOComponenteTA.getText());
		renglon.setObservaciones(observacionesEquipoOComponenteTA.getText());
		
		renglon.setEnAlmacen(false);
		
		//Creamos el Label para eliminar y le seteamos su clickHandler.
		Label eliminarLb = new Label("");
		eliminarLb.setSize("16px", "16px");
		eliminarLb.setStyleName("labelBorrar");
		
		eliminarLb.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int aEliminar = equiposYComponentesFT.getCellForEvent(event).getRowIndex();
				equiposYComponentesFT.removeRow(aEliminar);
				renglonesOrdenPedidoDTO.remove(aEliminar - 1);
			}
		});
		
		equiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
		equiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
		equiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
		
		//Agregamos el renglón a la lista de renglones existente.
		renglonesOrdenPedidoDTO.add(renglon);
		
		//Dejamos la pantalla lista para cargar un nuevo equipo o componente.
		nombreParaClienteTB.setText("");
		cantidadTB.setText("");
		observacionesEquipoOComponenteTA.setText("");
	}
	
	/**
	 * Método que carga un componente que va a ser construido a la tabla de equipos y componentes.
	 */
	public void cargarComponente(ComponentePatronDTO componentePatronDTO) {
				
		RenglonOrdenPedidoDTO renglon = new RenglonOrdenPedidoDTO();
		
		//Se establece el nombre de componente.
		componentePatronDTO.setNombre((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).split(" - "))[1]);
		
		//Se establece el tipo que hay en el renglón y su id.
		renglon.setEquipoOComponente("COMPONENTE");
		renglon.setIdEquipoOComponente(componentePatronDTO.getIdComponentePatron());
		
		int filaSiguiente = equiposYComponentesFT.getRowCount();

		//Se rellena el código de componente para que tenga la longitud y formato adecuados.
		equiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoComponentePatron(componentePatronDTO));
		renglon.setCodigo(Validaciones.rellenarCodigoComponentePatron(componentePatronDTO));
				
		//Si el Nombre para cliente está vacío, se establece el mismo como el del componente.
		if (nombreParaClienteTB.getText().isEmpty())
			renglon.setNombre(componentePatronDTO.getNombre());
		else
			renglon.setNombre(nombreParaClienteTB.getText());
		
		//Si el campo Nombre para cliente es demasiado grande, se le colocan tres puntos y se lo acorta.
		if (renglon.getNombre().length() > 30)
			equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre().substring(0, 30) + "...");
		else
			equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre());
		
		equiposYComponentesFT.setText(filaSiguiente, CANTIDAD, cantidadTB.getText());
		renglon.setCantidad(Integer.parseInt(cantidadTB.getText()));
		
		//Si el campo Observaciones es demasiado grande, se le colocan tres puntos y se lo acorta.
		if (observacionesEquipoOComponenteTA.getText().length() > 50)
			equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, observacionesEquipoOComponenteTA.getText().substring(0, 50) + "...");
		else
			equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, observacionesEquipoOComponenteTA.getText());
		renglon.setObservaciones(observacionesEquipoOComponenteTA.getText());
		
		renglon.setEnAlmacen(false);
		
		//Creamos el Label para eliminar y le seteamos su clickHandler.
		Label eliminarLb = new Label("");
		eliminarLb.setSize("16px", "16px");
		eliminarLb.setStyleName("labelBorrar");
		
		eliminarLb.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int aEliminar = equiposYComponentesFT.getCellForEvent(event).getRowIndex();
				equiposYComponentesFT.removeRow(aEliminar);
				renglonesOrdenPedidoDTO.remove(aEliminar - 1);
			}
		});
		
		equiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
		equiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
		equiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
		
		//Agregamos el renglón a la lista de renglones existente.
		renglonesOrdenPedidoDTO.add(renglon);
		
		//Dejamos la pantalla lista para cargar un nuevo equipo o componente.
		nombreParaClienteTB.setText("");
		cantidadTB.setText("");
		observacionesEquipoOComponenteTA.setText("");
	}

	
	/**
	 * Llama a la pantalla para agregar un equipo o componente existente en almacén.
	 */
	private void agregarDesdeAlmacen() {
		
		final P_AgregarDesdeAlmacen p_agregarDesdeAlmacen = new P_AgregarDesdeAlmacen(padre);
		p_agregarDesdeAlmacen.setGlassEnabled(true);
		p_agregarDesdeAlmacen.center();
		p_agregarDesdeAlmacen.show();
		
		p_agregarDesdeAlmacen.addCloseHandler(new CloseHandler<PopupPanel>() {
			public void onClose(CloseEvent<PopupPanel> event) {
				renglonesDesdeAlmacen = p_agregarDesdeAlmacen.obtenerRenglonesDesdeAlmacen();
								
				for (RenglonOrdenPedidoDTO renglon: renglonesDesdeAlmacen) {				
					int filaSiguiente = equiposYComponentesFT.getRowCount();

					//Se coloca el código en la tabla.
					equiposYComponentesFT.setText(filaSiguiente, CODIGO, renglon.getCodigo());
					
					//Si el campo Nombre para cliente es demasiado grande, se le colocan tres puntos y se lo acorta.
					if (renglon.getNombre().length() > 30)
						equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre().substring(0, 30) + "...");
					else
						equiposYComponentesFT.setText(filaSiguiente, NOMBRE_PARA_CLIENTE, renglon.getNombre());
					
					equiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(renglon.getCantidad()));
					
					equiposYComponentesFT.setText(filaSiguiente, OBSERVACIONES, "DESDE ALMACEN");
					
					//Actualizamos la cantidad disponible en la base de datos.
					actualizarCantidadesInventario(renglon, renglon.getCantidad());
					
					//Creamos el Label para eliminar y le seteamos su clickHandler.
					Label eliminarLb = new Label("");
					eliminarLb.setSize("16px", "16px");
					eliminarLb.setStyleName("labelBorrar");
					
					eliminarLb.addClickHandler(new ClickHandler() {
						public void onClick(ClickEvent event) {
							int aEliminar = equiposYComponentesFT.getCellForEvent(event).getRowIndex();
							equiposYComponentesFT.removeRow(aEliminar);
							
							RenglonOrdenPedidoDTO renglonAEliminar = renglonesOrdenPedidoDTO.get(aEliminar - 1);
							actualizarCantidadesInventario(renglonAEliminar, -renglonAEliminar.getCantidad());
							
							renglonesOrdenPedidoDTO.remove(aEliminar - 1);
						}
					});
					
					equiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
					equiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
					equiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
					
					//Agregamos el renglón a la lista de renglones existente.
					renglonesOrdenPedidoDTO.add(renglon);
				}
			}
		});
	}
	
	public void actualizarCantidadesInventario(RenglonOrdenPedidoDTO renglon, int cantidadARestar) {
		
		int codigoClase = Integer.parseInt(renglon.getCodigo().substring(0, 2));
		int codigoSubclase = Integer.parseInt(renglon.getCodigo().substring(2, 4));
		String version = renglon.getCodigo().split("-")[1];
		int plano = Integer.parseInt(renglon.getCodigo().split("-")[3]);
		
		if (renglon.getEquipoOComponente().equals("EQUIPO")) {
			
			ingenieriaService.actualizarCantidadEquipoPatron(codigoClase, codigoSubclase, plano, version, cantidadARestar, new AsyncCallback<Integer>() {
				@Override
				public void onSuccess(Integer result) {
				}

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO");
				}
			});
		}
		
		else {
			int codigoComponente = Integer.parseInt(renglon.getCodigo().split("-")[2].substring(0, 2));
			int codigoSubcomponente = Integer.parseInt(renglon.getCodigo().split("-")[2].substring(2, 4));
			
			ingenieriaService.actualizarCantidadComponentePatron(codigoClase, codigoSubclase, version, codigoComponente, codigoSubcomponente, plano, cantidadARestar, new AsyncCallback<Integer>() {
				@Override
				public void onSuccess(Integer result) {
				}

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO");
				}
			});
		}
	}
	
	public boolean validarCampos() {
		
		List<String> errores = new LinkedList<String>();
		String mensaje = "";
		boolean resultado = true;
		
		if (cantidadTB.getText().equals(""))
			errores.add("- La \"Cantidad\" no puede ser vacía.");
		
		else {
			try{
				Integer.parseInt(cantidadTB.getText());
				
				if (Integer.parseInt(cantidadTB.getText()) <= 0)
					throw new Exception();
			}
			
			catch(Exception e)
			{
				errores.add("- La \"Cantidad\" sólo puede ser un número entero positivo.");				
			}
		}
		
		if (observacionesEquipoOComponenteTA.getText().length() > 499)
			errores.add("- Las \"Observaciones\" no deben sobrepasar los 500 caracteres.");
				
		//Si hubo errores, armamos el mensaje de error.
		if(errores.size() > 0){
			resultado = false;
			
			mensaje = mensaje + errores.get(0);
			
			for(int i=1; i<errores.size(); i++)
				mensaje = mensaje + '\n' + '\n' + errores.get(i);
			
			Window.alert(mensaje);
		}
			
		return resultado;
	}
	
	
	public boolean validarOrden() {
		
		List<String> errores = new LinkedList<String>();
		String mensaje = "";
		boolean resultado = true;
		
		//Debe haber al menos una fila cargada
		if (equiposYComponentesFT.getRowCount() < 2)
			errores.add("- Al menos debe existir un renglón cargado a la orden de pedido.");
				
		//Si hubo errores, armamos el mensaje de error.
		if(errores.size() > 0){
			resultado = false;
			
			mensaje = mensaje + errores.get(0);
			
			for(int i=1; i<errores.size(); i++)
				mensaje = mensaje + '\n' + '\n' + errores.get(i);
			
			Window.alert(mensaje);
			generarBtn.setEnabled(true);
			
			if (!ordenPedidoDTO.getEstado().equals("GENERADA")) {
				guardarBtn.setEnabled(true);
			}
		}
			
		return resultado;
	}
	
	private void generarOrdenPedido() {
		
		ordenPedidoDTO.setEstado("GENERADA");
		
		VentasServiceAsync ventasService = GWT.create(VentasService.class);

		ventasService.registrarOrdenPedido(ordenPedidoDTO, new AsyncCallback<Long>() {
			@Override
			public void onSuccess(Long result) {
				Window.alert("La orden de pedido número " + result + " ha sido generada exitosamente.");
				salir();
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				generarBtn.setEnabled(true);
			}
		});
	}
	
	private void guardarOrdenPedido() {
		
		ordenPedidoDTO.setEstado("GUARDADA");
		
		VentasServiceAsync ventasService = GWT.create(VentasService.class);

		ventasService.registrarOrdenPedido(ordenPedidoDTO, new AsyncCallback<Long>() {
			@Override
			public void onSuccess(Long result) {
				Window.alert("La orden de pedido número " + result + " ha sido guardada exitosamente.");
				salir();
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				guardarBtn.setEnabled(true);
			}
		});
	}
	
	public void cancelar(ClickEvent event) {
		
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_EditarOrdenPedidoSeleccion pEditarOrdenPedidoSeleccion = new P_EditarOrdenPedidoSeleccion(padre, tituloTab);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(pEditarOrdenPedidoSeleccion);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++) {
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	}
	
	public void salir() {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}
